home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-10-11 | 11.6 KB | 328 lines | [TEXT/MMCC] |
- /*================================================================================
- WindowHandler.cp
-
- ©1994 Greg Anderson
- greggor@apple.com
-
- Classes and methods that handle window events
-
- ================================================================================*/
- #include <AppleEvents.h>
- #include "WindowHandler.h"
- #include "MacUtilities.h"
- #include "DialogUtilities.h"
- #include "Exceptions.h"
-
-
- //----------------------------------------------------------------------------------------
- // GetWindowHandler:
- //
- // Return the window handler stored in the RefCon of this window, or fail if the
- // RefCon of this window does not point to a window handler.
- //----------------------------------------------------------------------------------------
- TWindowHandler* GetWindowHandler(WindowPtr window)
- {
- //
- // Get the window handler from the refCon of the window
- //
- TWindowHandler* handler = nil;
- if(window != nil)
- handler = (TWindowHandler*)GetWRefCon(window);
-
- //
- // If the handler is not valid, then fail
- //
- if((handler == nil) || (PtrValid((Ptr)handler) == false) || (handler->IsValidHandler() == false))
- Throw(eNoWindowHandler);
-
- return handler;
- } // GetWindowHandler
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::~TWindowHandler:
- //----------------------------------------------------------------------------------------
- TWindowHandler::~TWindowHandler()
- {
- } // TWindowHandler::~TWindowHandler
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::IWindowHandler:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::IWindowHandler(WindowPtr window)
- {
- fWindow = window;
- SetWRefCon(window, (long) this);
- } // TWindowHandler::IWindowHandler
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::Idle:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::Idle(EventRecord* event)
- {
- } // TWindowHandler::Idle
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::KeyDown:
- //----------------------------------------------------------------------------------------
- Boolean TWindowHandler::KeyDown(EventRecord* event, char keyPressed)
- {
- return false;
- } // TWindowHandler::KeyDown
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::Update:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::Update(EventRecord* event)
- {
- } // TWindowHandler::Update
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::Activate:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::Activate(EventRecord* event)
- {
- } // TWindowHandler::Activate
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::Deactivate:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::Deactivate(EventRecord* event)
- {
- } // TWindowHandler::Deactivate
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::Resume:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::Resume(EventRecord* event)
- {
- this->Activate(event);
- } // TWindowHandler::Resume
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::Suspend:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::Suspend(EventRecord* event)
- {
- this->Deactivate(event);
- } // TWindowHandler::Suspend
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::ContentClick:
- //----------------------------------------------------------------------------------------
- Boolean TWindowHandler::ContentClick(EventRecord* event)
- {
- return false;
- } // TWindowHandler::ContentClick
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::ResizeWindow:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::ResizeWindow(Point where)
- {
- } // TWindowHandler::ResizeWindow
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::CloseAndDelete:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::CloseAndDelete()
- {
- delete this;
- } // TWindowHandler::CloseAndDelete
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::CloseWindowByUser:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::CloseWindowByUser()
- {
- this->CloseAndDelete();
- } // TWindowHandler::CloseWindowByUser
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::SetupCursorShape:
- //----------------------------------------------------------------------------------------
- Boolean TWindowHandler::SetupCursorShape(Point localMousePoint, RgnHandle localMouseRgn)
- {
- return false;
- } // TWindowHandler::SetupCursorShape
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::SetupMenus:
- //
- // The frontmost window is given a chance to change the way that menus are enabled
- // and disabled
- //----------------------------------------------------------------------------------------
- void TWindowHandler::SetupMenus()
- {
- } // TWindowHandler::SetupMenus
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::ProcessMenuSelection:
- //
- // The frontmost window is given a chance to process a menu command before it is
- // passed to the general menu handler
- //----------------------------------------------------------------------------------------
- Boolean TWindowHandler::ProcessMenuSelection(short commandID)
- {
- return false;
- } // TWindowHandler::ProcessMenuSelection
-
- //----------------------------------------------------------------------------------------
- // TWindowHandler::DialogManagerEvent:
- //----------------------------------------------------------------------------------------
- void TWindowHandler::DialogManagerEvent(EventRecord* event, short itemHit)
- {
- } // TWindowHandler::DialogManagerEvent
-
-
- //========================================================================================
- // CLASS TModelessDialogHandler
- //========================================================================================
-
-
- //----------------------------------------------------------------------------------------
- // TModelessDialogHandler::~TModelessDialogHandler:
- //----------------------------------------------------------------------------------------
- TModelessDialogHandler::~TModelessDialogHandler()
- {
- } // TModelessDialogHandler::~TModelessDialogHandler
-
- //----------------------------------------------------------------------------------------
- // TModelessDialogHandler::IModelessDialogHandler:
- //----------------------------------------------------------------------------------------
- void TModelessDialogHandler::IModelessDialogHandler(DialogPtr dialog)
- {
- TWindowHandler::IWindowHandler(dialog);
-
- //
- // Center and display the dialog as soon as it is initialized
- //
- CenterAndShowDialog(dialog);
- } // TModelessDialogHandler::IModelessDialogHandler
-
- //----------------------------------------------------------------------------------------
- // TModelessDialogHandler::KeyDown:
- //----------------------------------------------------------------------------------------
- Boolean TModelessDialogHandler::KeyDown(EventRecord* event, char keyPressed)
- {
- Boolean eventHandled = false;
- short defaultButton = ((DialogPeek)this->DialogBoxPtr())->aDefItem;
-
- //
- // Intercept Return if there is a default button
- //
- if(((keyPressed == '\r') || (keyPressed == '\n')) && (DialogItemEnabled(this->DialogBoxPtr(), defaultButton)))
- {
- FlashDlogItem(this->DialogBoxPtr(), defaultButton);
- this->DialogManagerEvent(event, defaultButton);
- eventHandled = true;
- }
- //
- // We have to handle TAB ourselves, because the dialog manager
- // refuses to skip disabled editText items
- //
- else if(keyPressed == '\t')
- {
- TabToNextEnabledTEItem(this->DialogBoxPtr());
- eventHandled = true;
- }
- //
- // If there are no enabled edit text items, then eat all keypresses
- // (Note: assumes that item #1 is not an editText item)
- //
- else if(EnabledTEItemsExist(this->DialogBoxPtr()) == false)
- {
- eventHandled = true;
- }
-
- return eventHandled;
- } // TModelessDialogHandler::KeyDown
-
- //----------------------------------------------------------------------------------------
- // TModelessDialogHandler::ContentClick:
- //
- // The dialog manager doesn't deal with deactive TextEdit items very well, so we're
- // going to intercept keypresses to inactive editText items here.
- //----------------------------------------------------------------------------------------
- Boolean TModelessDialogHandler::ContentClick(EventRecord* event)
- {
- Rect tRect;
- Handle itemHandle = nil;
- short itemType;
- Point localMousePoint = event->where;
- Boolean eventHandled = false;
-
- //
- // Make 'localMousePoint' really be local
- //
- GlobalToLocal(&localMousePoint);
-
- //
- // Modeless dialog boxes may use FindDItem to find edit text items
- // underneath the cursor
- //
- short itemNum = FindDItem(this->DialogBoxPtr(),localMousePoint) + 1;
- if(itemNum > 0)
- {
- GetDItem(this->DialogBoxPtr(),itemNum,&itemType,&itemHandle,&tRect);
-
- //
- // If the itemType has the 'disabled' bit set, don't pass through
- // mouse clicks (one would think that the dialog manager would take
- // care of this, but disabled editText items do get mouse clicks).
- //
- if(itemType & itemDisable)
- eventHandled = true;
- }
-
- return eventHandled;
- } // TModelessDialogHandler::ContentClick
-
- //----------------------------------------------------------------------------------------
- // TModelessDialogHandler::CloseAndDelete:
- //----------------------------------------------------------------------------------------
- void TModelessDialogHandler::CloseAndDelete()
- {
- DisposDialog(this->DialogBoxPtr());
- delete this;
- } // TModelessDialogHandler::CloseAndDelete
-
- //----------------------------------------------------------------------------------------
- // TModelessDialogHandler::SetupCursorShape:
- //
- // Set the cursor to an I-beam if it passes over an editText item
- //----------------------------------------------------------------------------------------
- Boolean TModelessDialogHandler::SetupCursorShape(Point localMousePoint, RgnHandle localMouseRgn)
- {
- Rect tRect;
- Handle itemHandle = nil;
- short itemType;
- Boolean used = false;
-
- //
- // Modeless dialog boxes may use FindDItem to find edit text items
- // underneath the cursor
- //
- short itemNum = FindDItem(this->DialogBoxPtr(),localMousePoint) + 1;
- if(itemNum > 0)
- {
- GetDItem(this->DialogBoxPtr(),itemNum,&itemType,&itemHandle,&tRect);
- if(itemType == editText)
- ChangeCursor(iBeamCursor);
- else
- ChangeCursor(0);
-
- //
- // We don't need to recalculate the cursor shape as long as we are
- // on top of this control
- //
- if(localMouseRgn != nil)
- RectRgn(localMouseRgn, &tRect);
- used = true;
- }
-
- if(used == false)
- used = TWindowHandler::SetupCursorShape(localMousePoint, localMouseRgn);
-
- return used;
- } // TModelessDialogHandler::SetupCursorShape
-